package com.benshou.bsoa.common.dao.params;

import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.conditions.AbstractChainWrapper;
import jakarta.validation.constraints.NotNull;
import lombok.NonNull;

/**
 * 查询参数接口
 * <p>
 * 该接口定义了应用查询参数到MyBatis-Plus查询包装器的方法。
 * 实现此接口的类可以封装特定查询条件，使查询逻辑更加模块化和可重用。
 * </p>
 * 
 * @param <Model> 查询目标实体类型
 * @author <a href="mailto:liuzhenbang@benshou.com">Liu Zhenbang</a>
 */
public interface QueryParams<Model> {

    /**
     * 将查询参数应用到查询包装器
     * <p>
     * 此方法允许实现类向查询包装器添加特定的查询条件
     * </p>
     *
     * @param wrapper 要应用参数的查询包装器
     * @param <Wrapper> 查询包装器类型
     * @return 应用参数后的查询包装器
     */
    @NotNull <
            Wrapper extends AbstractChainWrapper<Model, SFunction<Model, ?>, Wrapper, Lambda>,
            Lambda extends AbstractLambdaWrapper<Model, Lambda>
            > Wrapper applyParams(
            @NonNull Wrapper wrapper
    );
}
